package stage_1_module_4.code.homework_3;

import java.io.File;
import java.util.ArrayList;
// import java.util.concurrent.ExecutorService;
// import java.util.concurrent.Executors;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *  使用线程池将一个目录中的所有内容拷贝到另外一个目录中，包含子目录中的内容。 
 * 思路：
 * 1.定义两个列表，待生成的目录列表dirlist和待拷贝的文件列表filelist
 * 2.遍历要复制的源目录from，并分别把各级目录放入dirlist，各文件放入filelist
 * 3.遍历dirlist，循环生成目标目录的各级子目录
 * 4.定义Copy线程，重写run方法，实现从sfile到tfile的文件拷贝
 * 5.声明一个线程池
 * 6.遍历filelist，循环把待复制的文件任务开启线程Copy并放入线程池执行
 * 7.关闭线程池，结束任务
 */
public class Answer {
    
    //文件列表
    public static List<String> filelist = new ArrayList<>();
    //目录列表
    public static List<String> dirlist = new ArrayList<>();

    public static void main(String[] args) {
        String base = "./stage_1_module_4/code/homework_3/";
        //源目录
        String dir = "from";
        //目标目录
        String to = "to";
        File f = new File(base+dir);
        //遍历待复制的目录，分别记录各级目录列表和待复制的文件列表
        listFiles(f,"",true);

        //创建各级目录
        for (String dirpath : dirlist) {
            String dname = base+to+dirpath;
            File d = new File(dname);
            if (!d.exists()) {
                d.mkdir();
                System.out.println("创建目录"+dname);
            }
        }

        ExecutorService es = Executors.newFixedThreadPool(10);
        for (String fpath : filelist) {
            String sfile = base+"from"+fpath;
            String tfile = base+"to"+fpath;
            System.out.println(base+"文件路径:"+fpath);
            es.submit(new Copy(sfile,tfile));
        }
        es.shutdown();
    }


    /**
     * 递归分析目录结构，并获取root目录下的各级目录和文件路径
     * @param f
     * @param ppath
     * @param isRoot
     */
    public static void listFiles(File f, String ppath, boolean isRoot) {
        File[] fl;
        if (f.isDirectory()) {
            String dirname;
            if (!isRoot) {
                dirname = ppath+"/"+f.getName();
                System.out.println("目录名称"+dirname);
                dirlist.add(dirname);
            }
            // System.out.println("进入目录"+f.getName());
            fl = f.listFiles();
            for (File file : fl) {
                if (file.isDirectory()) {
                    if (isRoot) {
                        listFiles(file, "", false);
                    } else {
                        listFiles(file, ppath+"/"+f.getName(), false);
                    }
                }
                if (file.isFile()) {
                    String fullname;
                    if (isRoot) {
                        fullname = "/"+file.getName();
                    } else {
                        fullname = ppath+"/"+f.getName()+"/"+file.getName();
                    }

                    filelist.add(fullname);
                    System.out.println("文件地址"+file.getPath());
                }
            }
        }
        if (f.isFile()) {
            String fullname;
            if (isRoot) {
                fullname = f.getName();
            } else {
                fullname = ppath+"/"+f.getName();
            }
            filelist.add(fullname);
            System.out.println("文件地址"+f.getPath());
        }
    }
}

